home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / FFPMUL2.SA < prev    next >
Text File  |  1989-08-30  |  6KB  |  134 lines

  1.          TTL       FAST FLOATING POINT PRECISE MULTIPLY (FFPMUL2)
  2. *******************************************
  3. * (C)  COPYRIGHT 1980 BY MOTOROLA INC.    *
  4. *******************************************
  5.  
  6. ********************************************
  7. *          FFPMUL2 SUBROUTINE              *
  8. *                                          *
  9. *   THIS MODULE IS THE SECOND OF THE       *
  10. *   MULTIPLY ROUTINES.  IT IS 18% SLOWER   *
  11. *   BUT PROVIDES THE HIGHEST ACCURACY      *
  12. *   POSSIBLE.  THE ERROR IS EXACTLY .5     *
  13. *   LEAST SIGNIFICANT BIT VERSUS AN ERROR  *
  14. *   IN THE HIGH-SPEED DEFAULT ROUTINE OF   *
  15. *   .50390625 LEAST SIGNIFICANT BIT DUE    *
  16. *   TO TRUNCATION.                         *
  17. *                                          *
  18. * INPUT:                                   *
  19. *          D6 - FLOATING POINT MULTIPLIER  *
  20. *          D7 - FLOATING POINT MULTIPLICAN *
  21. *                                          *
  22. * OUTPUT:                                  *
  23. *          D7 - FLOATING POINT RESULT      *
  24. *                                          *
  25. * REGISTERS D3 THRU D5 ARE VOLATILE        *
  26. *                                          *
  27. * CONDITION CODES:                         *
  28. *          N - SET IF RESULT NEGATIVE      *
  29. *          Z - SET IF RESULT IS ZERO       *
  30. *          V - SET IF OVERFLOW OCCURRED    *
  31. *          C - UNDEFINED                   *
  32. *          X - UNDEFINED                   *
  33. *                                          *
  34. * CODE: 134 BYTES    STACK WORK: 0 BYTES   *
  35. *                                          *
  36. * NOTES:                                   *
  37. *   1) MULTIPIER UNALTERED (D6).           *
  38. *   2) UNDERFLOWS RETURN ZERO WITH NO      *
  39. *      INDICATOR SET.                      *
  40. *   3) OVERFLOWS WILL RETURN THE MAXIMUM   *
  41. *      VALUE WITH THE PROPER SIGN AND THE  *
  42. *      'V' BIT SET IN THE CCR.             *
  43. *                                          *
  44. *  TIMES: (8MHZ NO WAIT STATES ASSUMED)    *
  45. * ARG1 ZERO            5.750 MICROSECONDS  *
  46. * ARG2 ZERO            3.750 MICROSECONDS  *
  47. * MINIMUM TIME OTHERS 45.750 MICROSECONDS  *
  48. * MAXIMUM TIME OTHERS 61.500 MICROSECONDS  *
  49. * AVERAGE OTHERS      52.875 MICROSECONDS  *
  50. *                                          *
  51. ********************************************
  52.        PAGE
  53. FFPMUL2  IDNT  1,1 FFP HIGH-PRECISION MULTIPLY
  54.  
  55.        XDEF     FFPMUL2      ENTRY POINT
  56.        XREF     FFPCPYRT     COPYRIGHT NOTICE
  57.  
  58.        SECTION   9
  59.  
  60.  
  61. * FFPMUL2 SUBROUTINE ENTRY POINT
  62. FFPMUL2 MOVE.B D7,D5     PREPARE SIGN/EXPONENT WORK       4
  63.        BEQ.S  FFMRTN    RETURN IF RESULT ALREADY ZERO    8/10
  64.        MOVE.B D6,D4     COPY ARG1 SIGN/EXPONENT          4
  65.        BEQ.S  FFMRT0    RETURN ZERO IF ARG1=0            8/10
  66.        ADD.W  D5,D5     SHIFT LEFT BY ONE                4
  67.        ADD.W  D4,D4     SHIFT LEFT BY ONE                4
  68.        MOVEQ  #-128,D3  PREPARE EXPONENT MODIFIER ($80)  4
  69.        EOR.B  D3,D4     ADJUST ARG1 EXPONENT TO BINARY   4
  70.        EOR.B  D3,D5     ADJUST ARG2 EXPONENT TO BINARY   4
  71.        ADD.B  D4,D5     ADD EXPONENTS                    4
  72.        BVS.S  FFMOUF    BRANCH IF OVERFLOW/UNDERFLOW     8/10
  73.        MOVE.B D3,D4     OVERLAY $80 CONSTANT INTO D4     4
  74.        EOR.W  D4,D5     D5 NOW HAS SIGN AND EXPONENT     4
  75.        ROR.W  #1,D5     MOVE TO LOW 8 BITS               8
  76.        SWAP.W D5        SAVE FINAL S+EXP IN HIGH WORD    4
  77.        MOVE.W D6,D5     COPY ARG1 LOW BYTE               4
  78.        CLR.B  D7        CLEAR S+EXP OUT OF ARG2          4
  79.        CLR.B  D5        CLEAR S+EXP OUT OF ARG1 LOW BYTE 4
  80.        MOVE.W D5,D4     PREPARE ARG1LOWB FOR MULTIPLY    4
  81.        MULU.W D7,D4     D4 = ARG2LOWB X ARG1LOWB         38-54 (46)
  82.        SWAP.W D4        PLACE RESULT IN LOW WORD         4
  83.        MOVE.L D7,D3     COPY ARG2                        4
  84.        SWAP.W D3        TO ARG2HIGHW                     4
  85.        MULU.W D5,D3     D3 = ARG1LOWB X ARG2HIGHW        38-54 (46)
  86.        ADD.L  D3,D4     D4 = PARTIAL PRODUCT (NO CARRY)  8
  87.        SWAP.W D6        TO ARG1 HIGH TWO BYTES           4
  88.        MOVE.L D6,D3     COPY ARG1HIGHW OVER              4
  89.        MULU.W D7,D3     D3 = ARG2LOWB X ARG1HIGHW        38-54 (46)
  90.        ADD.L  D3,D4     D4 = PARTIAL PRODUCT             8
  91.        CLR.W  D4        CLEAR LOW END RUNOFF             4
  92.        ADDX.B D4,D4     SHIFT IN CARRY IF ANY            4
  93.        SWAP.W D4        PUT CARRY INTO HIGH WORD         4
  94.        SWAP.W D7        NOW TOP OF ARG2                  4
  95.        MULU.W D6,D7     D7 = ARG1HIGHW X ARG2HIGHW       40-70 (54)
  96.        SWAP.W D6        RESTORE ARG1                     4 
  97.        SWAP.W D5        RESTORE S+EXP TO LOW WORD
  98.        ADD.L  D4,D7     ADD PARTIAL PRODUCTS             8
  99.        BPL    FFMNOR    BRANCH IF MUST NORMALIZE         8/10
  100.        ADD.L  #$80,D7   ROUND UP (CANNOT OVERFLOW)       16
  101.        MOVE.B D5,D7     INSERT SIGN AND EXPONENT         4
  102.        BEQ.S  FFMRT0    RETURN ZERO IF ZERO EXPONENT     8/10
  103. FFMRTN RTS              RETURN TO CALLER                 16
  104.  
  105. * MUST NORMALIZE RESULT
  106. FFMNOR SUB.B   #1,D5    BUMP EXPONENT DOWN BY ONE        4
  107.        BVS.S   FFMRT0   RETURN ZERO IF UNDERFLOW         8/10
  108.        BCS.S   FFMRT0   RETURN ZERO IF SIGN INVERTED     8/10
  109.        MOVEQ   #$40,D4  ROUNDING FACTOR                  4
  110.        ADD.L   D4,D7    ADD IN ROUNDING FACTOR           8
  111.        ADD.L   D7,D7    SHIFT TO NORMALIZE               8
  112.        BCC.S   FFMCLN   RETURN NORMALIZED NUMBER         8/10
  113.        ROXR.L  #1,D7    ROUNDING FORCED CARRY IN TOP BIT 10
  114.        ADD.B   #1,D5    UNDO NORMALIZE ATTEMPT           4
  115. FFMCLN MOVE.B  D5,D7    INSERT SIGN AND EXPONENT         4
  116.        BEQ.S   FFMRT0   RETURN ZERO IF EXPONENT ZERO     8/10
  117.        RTS              RETURN TO CALLER                 16
  118.  
  119. * ARG1 ZERO
  120. FFMRT0 MOVE.L #0,D7     RETURN ZERO                      4
  121.        RTS              RETURN TO CALLER                 16
  122.  
  123. * OVERFLOW OR UNDERFLOW EXPONENT
  124. FFMOUF BPL.S  FFMRT0    BRANCH IF UNDERFLOW TO GIVE ZERO 8/10
  125.        EOR.B  D6,D7     CALCULATE PROPER SIGN            4
  126.        OR.L   #$FFFFFF7F,D7 FORCE HIGHEST VALUE POSSIBLE 16
  127.        TST.B  D7        SET SIGN IN RETURN CODE
  128. *        ORI.B   #$02,CCR                            SET OVERFLOW BIT
  129.        DC.L   $003C0002 ****SICK ASSEMBLER****           20
  130.        RTS              RETURN TO CALLER                 16
  131.  
  132.        END
  133.  
  134.